<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>CREATE ROLE</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="REFENTRY">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="sql-createopclass.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="sql-createopclass.html">快退</a></td><td width="60%" align="center" valign="bottom"></td><td width="10%" align="right" valign="top"><a href="sql-createrule.html">快进</a></td><td width="10%" align="right" valign="top"><a href="sql-createrule.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<h1><a name="SQL-CREATEROLE"></a>CREATE ROLE</h1>
<div class="REFNAMEDIV"><a name="AEN48033"></a><h2>名称</h2>CREATE ROLE&nbsp;--&nbsp;定义一个新数据库角色</div>
<a name="AEN48036"></a>
<div class="REFSYNOPSISDIV"><a name="AEN48038"></a><h2>语法</h2>
<pre class="SYNOPSIS">CREATE ROLE <tt class="REPLACEABLE"><i>name</i></tt> [ [ WITH ] <tt class="REPLACEABLE"><i>option</i></tt> [ ... ] ]

这里的 <tt class="REPLACEABLE"><i>option</i></tt> 可以是：

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | CREATEUSER | NOCREATEUSER
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | CONNECTION LIMIT <tt class="REPLACEABLE"><i>connlimit</i></tt>
    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD '<tt class="REPLACEABLE"><i>password</i></tt>'
    | VALID UNTIL '<tt class="REPLACEABLE"><i>timestamp</i></tt>'
    | IN ROLE <tt class="REPLACEABLE"><i>rolename</i></tt> [, ...]
    | IN GROUP <tt class="REPLACEABLE"><i>rolename</i></tt> [, ...]
    | ROLE <tt class="REPLACEABLE"><i>rolename</i></tt> [, ...]
    | ADMIN <tt class="REPLACEABLE"><i>rolename</i></tt> [, ...]
    | USER <tt class="REPLACEABLE"><i>rolename</i></tt> [, ...]
    | SYSID <tt class="REPLACEABLE"><i>uid</i></tt> </pre>
</div>
<div class="REFSECT1"><a name="AEN48052"></a><h2>描述</h2>
<p><tt class="COMMAND">CREATE ROLE</tt> 向一个数据库集群添加一个新角色。一个角色是一个可以拥有数据库对象并且拥有数据库权限的纪录；角色可以认为是一个"用户"、一个"组"、或者是两者兼有。请参考<a href="user-manag.html">章18</a>和<a href="client-authentication.html">章20</a>获得有关管理用户和权限的信息。要使用这条命令，你必须拥有 <tt class="LITERAL">CREATEROLE</tt> 权限或者是数据库超级用户。</p>
<p>请注意角色是在数据库集群的范畴里定义的，因此对数据库集群里的所有数据库都有效。</p>
</div>
<div class="REFSECT1"><a name="AEN48063"></a><h2>参数</h2>
<div class="VARIABLELIST">
<dl>
<dt><tt class="REPLACEABLE"><i>name</i></tt></dt>
<dd><p>新角色的名称</p></dd>
<dt><tt class="LITERAL">SUPERUSER</tt><br><tt class="LITERAL">NOSUPERUSER</tt></dt>
<dd><p>这些子句决定一个新角色是否为"超级用户"，这种用户可以超越数据库中的所有访问权限。超级用户状态是非常危险的，除非真正需要，否则不应该使用。如果没有声明，你自己必须是一个超级用户才能创建一个新的超级用户。如果没有指定，<tt class="LITERAL">NOSUPERUSER</tt> 将是缺省。</p></dd>
<dt><tt class="LITERAL">CREATEDB</tt><br><tt class="LITERAL">NOCREATEDB</tt></dt>
<dd><p>这些子句定义一个角色是否能创建数据库。如果声明了 <tt class="LITERAL">CREATEDB</tt> ，那么正在创建的角色可以创建新数据库。声明 <tt class="LITERAL">NOCREATEDB</tt> 将不会赋与新角色创建数据库的能力。如果没有声明，那么缺省是 <tt class="LITERAL">NOCREATEDB</tt></p></dd>
<dt><tt class="LITERAL">CREATEROLE</tt><br><tt class="LITERAL">NOCREATEROLE</tt></dt>
<dd><p>这些子句决定一个角色是否可以创建新角色(也就是执行 <tt class="COMMAND">CREATE ROLE</tt>)。一个拥有 <tt class="LITERAL">CREATEROLE</tt> 权限的角色也可以修改和删除其它角色。如果没有声明，缺省是 <tt class="LITERAL">NOCREATEROLE</tt></p></dd>
<dt><tt class="LITERAL">CREATEUSER</tt><br><tt class="LITERAL">NOCREATEUSER</tt></dt>
<dd><p>这些子句已经过时了，但是仍然接受，拼法为 <tt class="LITERAL">SUPERUSER</tt> 和 <tt class="LITERAL">NOSUPERUSER</tt> 。请注意它们并<span class="emphasis"><i class="EMPHASIS">不</i></span>等于 <tt class="LITERAL">CREATEROLE</tt> ！人们很可能轻易地这么认为。</p></dd>
<dt><tt class="LITERAL">INHERIT</tt><br><tt class="LITERAL">NOINHERIT</tt></dt>
<dd><p>这些子句决定一个角色是否"继承"它所在组的角色的权限。一个带有 <tt class="LITERAL">INHERIT</tt> 属性的角色可以自动使用已经赋与它直接或间接所在组的任何权限。没有 <tt class="LITERAL">INHERIT</tt> ，其它角色的成员关系只赋与该角色 <tt class="COMMAND">SET ROLE</tt> 成其它角色的能力；其它角色的权限只是在这么做了之后才能获得。如果没有声明，缺省是 <tt class="LITERAL">INHERIT</tt></p></dd>
<dt><tt class="LITERAL">LOGIN</tt><br><tt class="LITERAL">NOLOGIN</tt></dt>
<dd><p>这些子句决定一个角色是否可以登录；也就是说，该角色在客户端连接的时候是否可以被给予初始化会话的认证名字。一个拥有 <tt class="LITERAL">LOGIN</tt> 属性的角色可以认为是一个用户。没有这个属性的角色可以用于管理数据库权限，但是并不是平常概念的用户。如果没有声明，除非是调用 <tt class="COMMAND">CREATE ROLE</tt> 的别名 <tt class="COMMAND">CREATE USER</tt>，否则缺省将是 <tt class="LITERAL">NOLOGIN</tt> </p></dd>
<dt><tt class="LITERAL">CONNECTION LIMIT</tt> <tt class="REPLACEABLE"><i>connlimit</i></tt></dt>
<dd><p>如果角色可以登录，这个参数声明该角色可以使用的并发连接数量。-1(缺省)意味着没有限制。</p></dd>
<dt><tt class="LITERAL">PASSWORD</tt> <tt class="REPLACEABLE"><i>password</i></tt></dt>
<dd><p>设置角色的口令。口令只对那些拥有 <tt class="LITERAL">LOGIN</tt> 属性的角色有意义，不过你当然可以给没有这个属性的用户定义口令。如果你不准备使用口令认证，你可以忽略这个选项。如果没有指定口令，口令将被设为空并且该用户的密码认证将总是失败。也可以明确的用 <tt class="LITERAL">PASSWORD NULL</tt> 指定口令为空。</p></dd>
<dt><tt class="LITERAL">ENCRYPTED</tt><br><tt class="LITERAL">UNENCRYPTED</tt></dt>
<dd><p>这些关键字控制存储在系统表里面的口令是否加密。如果没有指定，那么缺省的行为由配置参数 <a href="runtime-config-connection.html#GUC-PASSWORD-ENCRYPTION">password_encryption</a> 控制。因为系统无法对指定的口令字符串进行解密，所以如果目前的口令字符串已经是用 MD5 加密的格式，那么那就会继续照此存放，而不管是否声明了 <tt class="LITERAL">ENCRYPTED</tt> 或 <tt class="LITERAL">UNENCRYPTED</tt> 。这样就允许在转储/回复的时候重新加载加密的口令。</p>
<p>请注意老的客户端可能缺乏对 MD5 认证机制的支持，以密文形式存储的口令需要这个机制来运作。</p></dd>
<dt><tt class="LITERAL">VALID UNTIL</tt> '<tt class="REPLACEABLE"><i>timestamp</i></tt>'</dt>
<dd><p><tt class="LITERAL">VALID UNTIL</tt> 子句设置角色的口令失效的时间戳。如果忽略了这个子句，那么口令将永远有效。</p></dd>
<dt><tt class="LITERAL">IN ROLE</tt> <tt class="REPLACEABLE"><i>rolename</i></tt></dt>
<dd><p><tt class="LITERAL">IN ROLE</tt> 子句列出一个或多个现有的角色，新角色将立即加入这些角色，成为它们的成员。请注意没有任何选项可以把新角色添加为管理员；必须使用独立的 <tt class="COMMAND">GRANT</tt> 命令来做这件事情。</p></dd>
<dt><tt class="LITERAL">IN GROUP</tt> <tt class="REPLACEABLE"><i>rolename</i></tt></dt>
<dd><p><tt class="LITERAL">IN GROUP</tt> 是 <tt class="LITERAL">IN ROLE</tt> 的过时的拼法。</p></dd>
<dt><tt class="LITERAL">ROLE</tt> <tt class="REPLACEABLE"><i>rolename</i></tt></dt>
<dd><p><tt class="LITERAL">ROLE</tt> 子句列出一个或多个现有的角色，它们将自动添加为这个新角色的成员。这个动作实际上就是把新角色做成一个"组"。</p></dd>
<dt><tt class="LITERAL">ADMIN</tt> <tt class="REPLACEABLE"><i>rolename</i></tt></dt>
<dd><p><tt class="LITERAL">ADMIN</tt> 子句类似 <tt class="LITERAL">ROLE</tt> ，只是给出的角色被增加到新角色 <tt class="LITERAL">WITH ADMIN OPTION</tt> ，给他们以把这个角色的成员权限赋与其它角色的权力。</p></dd>
<dt><tt class="LITERAL">USER</tt> <tt class="REPLACEABLE"><i>rolename</i></tt></dt>
<dd><p><tt class="LITERAL">USER</tt> 子句是 <tt class="LITERAL">ROLE</tt> 子句的过时拼法。</p></dd>
<dt><tt class="LITERAL">SYSID</tt> <tt class="REPLACEABLE"><i>uid</i></tt></dt>
<dd><p><tt class="LITERAL">SYSID</tt> 子句将被忽略，但是仍然接受之，主要为了向下兼容。</p></dd>
</dl>
</div>
</div>
<div class="REFSECT1"><a name="AEN48214"></a><h2>注意</h2>
<p>使用 <a href="sql-alterrole.html"><i>ALTER ROLE</i></a> 改变一个角色的属性，使用 <a href="sql-droprole.html"><i>DROP ROLE</i></a> 删除一个角色。所有在 <tt class="COMMAND">CREATE ROLE</tt> 里声明的角色都可以在随后的 <tt class="COMMAND">ALTER ROLE</tt> 命令里修改。</p>
<p>给一个当作组来使用的角色添加或删除成员的比较好的方法是使用 <a href="sql-grant.html"><i>GRANT</i></a> 和 <a href="sql-revoke.html"><i>REVOKE</i></a></p>
<p>The <tt class="LITERAL">VALID UNTIL</tt> 子句只是为口令定义一个失效时限，而不是角色自身的失效时限。特别要注意的是，当以非口令为基础的认证方式登录的时候，这个失效时间将失去意义。</p>
<p><tt class="LITERAL">INHERIT</tt> 属性管理那些可赋予的权限的继承关系，也就是数据库对象的访问权限和角色成员的关系。它并不适用于 <tt class="COMMAND">CREATE ROLE</tt> 和 <tt class="COMMAND">ALTER ROLE</tt> 设置的特殊角色属性。比如，做为一个带有 <tt class="LITERAL">CREATEDB</tt> 权限的角色成员，并不直接拥有创建数据库的能力，即使设置了 <tt class="LITERAL">INHERIT</tt> 也如此；该角色还是需要通过 <a href="sql-set-role.html"><i>SET ROLE</i></a> 成为该角色，然后才能创建数据库。</p>
<p><tt class="LITERAL">INHERIT</tt> 属性是缺省的，原因是为了向下兼容：在以前的 PostgreSQL 版本里，用户总是拥有他们所在组的所有权限。不过，<tt class="LITERAL">NOINHERIT</tt> 提供了与 SQL 标准所定义的最接近的语意。</p>
<p>要注意 <tt class="LITERAL">CREATEROLE</tt> 权限，因为对于 <tt class="LITERAL">CREATEROLE</tt> 权限不存在继承的概念。拥有这个权限的角色可以很容易的创建一个与自身权限不同的非超级用户角色。例如，如果"user"角色拥有 <tt class="LITERAL">CREATEROLE</tt> 权限而无 <tt class="LITERAL">CREATEDB</tt> 权限，那么他可以创建带有 <tt class="LITERAL">CREATEDB</tt> 权限的新角色。因此具有 <tt class="LITERAL">CREATEROLE</tt> 权限的角色几乎相当于一个超级用户。</p>
<p>PostgreSQL 包括一个和 <tt class="COMMAND">CREATE ROLE</tt> 有一样功能的 <a href="app-createuser.html"><i><i>createuser</i></i></a> 程序(实际上就是调用这个命令)，可以从命令行 shell 上运行。</p>
<p><tt class="LITERAL">CONNECTION LIMIT</tt> 选项只是近似地强制；如果两个新的会话几乎同时启动，而只有该角色只剩下一个"连接槽"，那么很可能两个连接都会失败。同样，这个限制从来不会对超级用户强制。</p>
<p>在这个指令中指定未加密的口令时必须小心。口令将被以明文方式传递给服务器，同时还可能在客户端的命令历史或服务端日志中被记录。而 <a href="app-createuser.html"><i><i>createuser</i></i></a> 会将命令加密后传递给服务器。同样，<a href="app-psql.html"><i><i>psql</i></i></a> 包含一个 <tt class="COMMAND">\password</tt> 可以用来安全的修改口令。</p>
</div>
<div class="REFSECT1"><a name="AEN48257"></a><h2>例子</h2>
<p>创建一个可以登录的角色，但是不给他设置口令：</p>
<pre class="PROGRAMLISTING">CREATE ROLE jonathan LOGIN;</pre>
<p>创建一个带口令的角色：</p>
<pre class="PROGRAMLISTING">CREATE USER davide WITH PASSWORD 'jw8s0F4';</pre>
<p>(<tt class="COMMAND">CREATE USER</tt> 和 <tt class="COMMAND">CREATE ROLE</tt> 一样，只不过它隐含 <tt class="LITERAL">LOGIN</tt>)</p>
<p>创建一个带口令的角色，口令有效期到 2004 年底。在 2005 年跑了一秒之后，口令就不再有效。</p>
<pre class="PROGRAMLISTING">CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01';</pre>
<p>创建一个可以创建数据库和管理角色的角色：</p>
<pre class="PROGRAMLISTING">CREATE ROLE admin WITH CREATEDB CREATEROLE;</pre>
</div>
<div class="REFSECT1"><a name="AEN48270"></a><h2>兼容性</h2>
<p><tt class="COMMAND">CREATE ROLE</tt> 语句在 SQL 标准里存在，但是标准只要求下面的语法</p>
<pre class="SYNOPSIS">CREATE ROLE <tt class="REPLACEABLE"><i>name</i></tt> [ WITH ADMIN <tt class="REPLACEABLE"><i>rolename</i></tt> ]</pre>
<p>多初始化管理员，以及所有其它 <tt class="COMMAND">CREATE ROLE</tt> 的选项，都是 PostgreSQL 扩展。</p>
<p>SQL 标准定义了用户和角色的概念，但是它认为这两个概念是完全独立的概念，并且要求定义用户的所有命令都针对每个数据库实现。在 PostgreSQL 里选择了把用户和角色统一成一类对象。因此角色比标准里的有更多的属性。</p>
<p>SQL 标准里声明的行为非常接近于给予用户 <tt class="LITERAL">NOINHERIT</tt> 属性，而给予角色 <tt class="LITERAL">INHERIT</tt> 属性。</p>
</div>
<div class="REFSECT1"><a name="AEN48284"></a><h2>又见</h2><a href="sql-set-role.html"><i>SET ROLE</i></a>, <a href="sql-alterrole.html"><i>ALTER ROLE</i></a>, <a href="sql-droprole.html"><i>DROP ROLE</i></a>, <a href="sql-grant.html"><i>GRANT</i></a>, <a href="sql-revoke.html"><i>REVOKE</i></a>, <a href="app-createuser.html"><span class="APPLICATION">createuser</span></a></div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="sql-createopclass.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="sql-createrule.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">CREATE OPERATOR CLASS</td><td width="34%" align="center" valign="top"><a href="sql-commands.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">CREATE RULE</td></tr>
</table>
</div>
</body></html>